package org.tissou.server.Operations;

import org.tissou.client.Services.*;
import org.tissou.server.Utils.Variables_Globales;
import org.tissou.client.Services.MonException;

import java.util.List;
import java.util.ArrayList;
import java.util.Date;


/**
* Created by IntelliJ IDEA.
* User: Claire
* Date: 30-Nov-2008
* Time: 12:25:20
* To change this template use File | Settings | File Templates.
*/
public class Operation_VirInterne extends Operation_Base {

  Compte Compte_Debourseur;
  Compte Compte_Receveur;
  Float Somme;
  Boolean Verifie;

  CategorieInfos Categorie;
  ProprietaireInfos Proprietaire;
  String Libelle_Debourseur;
  String Libelle_Receveur;
  MonnaieInfos Monnaie;

  public Operation_VirInterne(Date date, Compte compte_debourseur, Compte compte_receveur, Float somme,
                              Boolean verifie) {
    Date = date;
    Compte_Debourseur = compte_debourseur;
    Compte_Receveur = compte_receveur;
    Somme = somme;
    Verifie = verifie;

    Categorie = (Variables_Globales.Tout.rechercherCategorieDansDescendance("Virement Interne")).getInfos();
    Proprietaire = Compte_Debourseur.getProprio();
    Monnaie = Compte_Debourseur.getMonnaie();
    Libelle_Debourseur = String.format("Vers %s", Compte_Receveur.getNomCompte());
    Libelle_Receveur = String.format("De %s", Compte_Debourseur.getNomCompte());
    TypeTransaction_Nom = "Operation virement interne";
  }

  private static boolean ConstruireAvecParametres_Compatibilite(Parametres parametres) {
    boolean resultat = true;
    if(!(parametres.NombreComptes() == 2)){
      throw new MonException("Au moins un des deux comptes n'a pas ete selectionne proprement");

    }
    if(!(parametres.NombreSommes() == 1)){
      throw new MonException("La somme n'a pas ete rentree !");
    }
    resultat &= (parametres.NombreCategories() == 0);
    resultat &= (parametres.NombreProprietaires() == 0);
    resultat &= (parametres.NombreLibelles() == 0);
    resultat &= (parametres.NombreMonnaies() == 0);
    resultat &= (parametres.NombreDettes() == 0);

    return resultat;
  }

  /*
  Operation_Virementinterne:
    Date Date = date;
    Boolean Verifie = verifie;
    OperationFactoryInfos.TypeOperation Typeoperation = OPERATION_VIREMENTINTERNE;

    List<CategorieInfos> Categories = void;
    List<ProprietaireInfos> Proprietaires = void;
    List<Compte> Comptes = compte debourseur, compte receveur;
    List<String> Libelles = new ArrayList<String>() = void;
    List<Dette> Dettes = new ArrayList<Dette>() = void;
    List<MonnaieInfos> Monnaies = new ArrayList<MonnaieInfos>() = void;
    List<Float> Sommes = new ArrayList<Float>() = somme concernee;
  */

  private static Operation_VirInterne ConstruireAvecParametres_Construction(Parametres parametres) {
    return new Operation_VirInterne(parametres.getDate(),
        parametres.getComptes().get(0),
        parametres.getComptes().get(1),
        parametres.getSommes().get(0),
        parametres.getVerifie()
    );
  }

  public static Operation_VirInterne ConstruireAvecParametres(Parametres parametres){
    if(ConstruireAvecParametres_Compatibilite(parametres)){
      return ConstruireAvecParametres_Construction(parametres);
    }
    else
      throw new MonException("Les parametres ne sont pas compatibles pour creer cette operation.");
  }

  public boolean Parametres_Compatibles(){
    if(Compte_Receveur.equals(Compte_Debourseur)){
      throw new MonException("Les comptes sont identiques, ca ne vas pas.");
    }
    if(!Compte.ProprietairesIdentiques(Compte_Receveur, Compte_Debourseur)){
      throw new MonException("On ne peut pas effectuer un virement interne entre deux comptes dont les " +
          "proprietaires sont differents.");
    }
    if(!Compte.MonnaiesIdentiques(Compte_Receveur,  Compte_Debourseur)){
      throw new MonException("On ne peut pas effectuer un virement interne entre deux comptes dont les " +
          "monnaies sont differentes.");
    }
    if(Somme<0){
      throw new MonException("La somme rentree est strictement negative, ca ne va pas.");
    }
    if(Compte_Receveur.estCeQueTesVirtuelMec()){
      throw new MonException("On ne peut pas effectuer de virements internes si un des comptes est virtuel." +
          "Ici c'est le cas : le compte receveur est virtuel, ca ne va pas.");
    }
    if(Compte_Debourseur.estCeQueTesVirtuelMec()){
      throw new MonException("On ne peut pas effectuer de virements internes si un des comptes est virtuel." +
          "Ici c'est le cas : le compte debourseur est virtuel, ca ne va pas.");
    }
    return true;
  }

  public List<Transaction> Retourne_Transactions() {
    List<Transaction> AAjouter = new ArrayList<Transaction>();
    AAjouter.add(new Transaction(Date, Compte_Debourseur, Categorie, Libelle_Debourseur, -Somme,
        Verifie, null));
    AAjouter.add(new Transaction(Date, Compte_Receveur, Categorie, Libelle_Receveur, Somme,
        Verifie, null));
    return AAjouter;
  }
}
